# 3.37 WiFi Piano
## 3.37.1 Overview
In this project, we set seven buttons to control the speaker to play tones of Do, Re, Mi, Fa, So, La, Si.
## 3.37.2 Test Code
In Files, open **3-37-wifiWebPiano.py** and click .
**Code:**
```python
'''
* Filename : 3-37-wifiWebPiano
* Thonny : Thonny 4.1.4
* Auther : http//www.keyestudio.com
'''
import network
import socket
import machine
import time
# WiFi connection information
SSID = 'your WiFi name' # your WiFi name
PASSWORD = 'your WiFi password' # your WiFi password
# connect to WiFi
def connect_wifi(ssid, password):
wlan = network.WLAN(network.STA_IF) # Create WLAN objects using STA mode (client mode)
wlan.active(True) # activate WLAN interface
wlan.connect(ssid, password) # Connect to the specified WiFi network
timeout = 10 # Connect timeout duration, in seconds
while not wlan.isconnected() and timeout > 0: # If the connection fails and the timeout period does not expire, check the connection status again
print("Connecting to WiFi...")
time.sleep(1)
timeout -= 1
if not wlan.isconnected(): # If the connection is not successful after timeout, an exception is thrown
raise Exception("Could not connect to WiFi")
print('Network config:', wlan.ifconfig()) # Output network configuration (IP address, subnet mask, gateway, and DNS)
print('Connected to WiFi, IP address:', wlan.ifconfig()[0]) # The IP address of the successful connection is displayed
return wlan
# create HTML page
def web_page():
html = """
ESP32 Web Server
ESP32 Tone Player
"""
return html # Return an HTML page with seven keys, one for each note
# Start the Web server
def start_server():
wlan = connect_wifi(SSID, PASSWORD) # connect to WiFi
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] # Obtain the local IP address and port 80
s = socket.socket() # Create a socket object
s.bind(addr) # Bind sockets to addresses and ports
s.listen(5) # Start listening for incoming connections. The maximum number of connections is 5
print('Listening on', addr) # Print the address and port on which the server is listening
while True:
cl, addr = s.accept() # Accept a client connection
print('Client connected from', addr) # Print the address of the client
request = cl.recv(1024) # Receive client requests, up to 1024 bytes
request = str(request) # Convert the request to a string
print('Content = %s' % request) # Print request content
response = web_page() # Generate HTML response
# Check the request path and play the corresponding note
if '/play_do' in request:
play_tone('do')
elif '/play_re' in request:
play_tone('re')
elif '/play_mi' in request:
play_tone('mi')
elif '/play_fa' in request:
play_tone('fa')
elif '/play_sol' in request:
play_tone('sol')
elif '/play_la' in request:
play_tone('la')
elif '/play_si' in request:
play_tone('si')
cl.send('HTTP/1.1 200 OK\n')
cl.send('Content-Type: text/html\n')
cl.send('Connection: close\n\n')
cl.sendall(response)
cl.close() # Close the client connection
# play tone
def play_tone(tone):
tones = {
'do': 261.63,
're': 293.66,
'mi': 329.63,
'fa': 349.23,
'sol': 392.00,
'la': 440.00,
'si': 493.88
}
frequency = tones.get(tone, 0)
if frequency > 0:
pwm = machine.PWM(machine.Pin(32)) # Output PWM signal using GPIO32 pin
pwm.freq(int(frequency))
pwm.duty(512) # Set the duty cycle to 50%
time.sleep_ms(200) # play tone to 1s
pwm.deinit() # turn off PWM
# run server
try:
start_server() # Try starting the Web server
except Exception as e:
print('Failed to start server:', e) # If the startup fails, an error message is displayed
machine.reset() # Restart the device to try to reconnect
```
**Result:**
Upload the code, and the OLED shows the IP address after connecting to wifi.
Connect your computer/mobile phone and ESP32 to the same wifi, and you can access the IP address to see the control page through your device.
